pub struct ReusableCounter {
    counter: i32,            // 递增的计数器
    pool: Vec<i32>,          // 存储可复用的数值
}

impl ReusableCounter {
    pub fn new() -> Self {
        ReusableCounter {
            counter: 0,
            pool: Vec::new(),
        }
    }

    // 获取一个可用的数值
    pub fn next(&mut self) -> i32 {
        // 如果有可以复用的数值，则优先从池中取
        if let Some(value) = self.pool.pop() {
            value
        } else {
            // 否则分配新的数值
            let value = self.counter;
            self.counter += 1;
            value
        }
    }

    // 将一个数值放回池中
    pub fn recycle(&mut self, value: i32) {
        self.pool.push(value);
    }
}
